/**
 * 映射类型: 基于旧类型创建新类型(对象类型),减少重复、提升开发效率
 */




//1.根据联合类型创建
type PropKeys = 'x' | 'y' | 'z' | 'c'

type t1 = {x:number;y:number;z:number}

//使用映射类型简化


type t2 = {[Key in PropKeys]:number}

let t:t2 = {x:1,y:2,z:3, c:3}

/**
 * 解释
 * 1.映射类型是基于索引签名类型的,所以,该语法类似索引签名类型,也用了 []
 * 2.Key in PropKeys 表示Key可以是PropKeys联合类型中任意一个,类似于 forin(let k in obj)
 * 3.使用映射类型创建的新对象类型Type2和Type1结构完全相同
 * 4.注意: 映射类型只能在类型别名中使用,不能在接口中使用
 */







//2.根据对象类型创建

type Props = {a:number,b:string,c:boolean}

type Type3 = {[Key in keyof Props]}

// 1.执行 keyof Props 拿到对象类型Props中的所有键的联合类型, 'a'|'b'|'c'
// 2.Key in 代表是拿到的 abc中人任意一个,即Props所有的键名中的任意一个
































